<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>my $queen; rule me {Perl6|Examples18}</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="Perl6_ES17.html">my enum Example17 <<:Perl(6) Today>></a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES19.html">m:nth(19)/Perl6Examples/</a></p>
<h1>my $queen; rule me {Perl6|Examples18}</h1>
<div class='content'>
<p>Category: <a href='Perl6.html'>Perl6</a> &nbsp; Keywords: <b>Rule Perl6</b></p><h3>preface</h3>
终于将 <a href='050604.html'>embed parrot in pugs</a>, 现在可以试试 Perl6 的 Rule 了。<br />
Thank God. 
<p>我们已经有一些中文文章介绍或详细描述了 Rule. 里面的一些基本东西我就不赘述了，我只写点我自己需要理解的东西。</p>
<ul>
<li><a href='http://www.fayland.org/Perl6/Synopsis/zh_cn/S05.pod'>纲要五：Rules</a>
<li><a href='http://www-106.ibm.com/developerworks/cn/linux/l-cpregex.html'>功能丰富的 Perl: Perl 6 语法和正则表达式</a>
</ul>

<h3>Immediate Match</h3>
立即匹配，这是一种最简单最常用的匹配方式。由操作符 m// 或 s/// 定义的规则都是属于立即匹配的。<br />
<pre>if ($string ~~ m/\w+/)      { . . . }
if ($string ~~ s/\w+/word/) { . . . }</pre>
// 操作符在智能匹配操作符下属于立即匹配，或在空，布尔，字符或数字上下文下属于立即匹配。
<pre>if ($string ~~ /\w+/)       { . . . } # ~~ 定义了立即匹配
$truth  = ?/\d+/;       # 布尔上下文，立即匹配 $_ 并返回真假
$count  = +/(\d+\s+)*/; # 数字上下文，立即匹配 $_ 并返回个数 
$string = ~/^\w+/;      # 字符串上下文，理解匹配 $_ 并返回字符串</pre>
</pre>

<h3>Deferred Matche</h3>
延后匹配，定义一种匿名规则，以后匹配的时候可以调用该规则（复用）。一般这么定义：
<pre>$digits = rx/\d+/;</pre>
// 操作符除上面的立即匹配环境外，其余都属于延后匹配：
<pre>$digits = /\d+/; # store rule</pre>
除了上面这两种定义外，还可以使用 rule 关键字定义：
<pre>$digits = rule {\d+};</pre>
上面其实是定义了一个匿名规则。我们可以用 rule 定义带名字的规则：
<pre>rule digits {\d+}</pre>
我们可以在迟些时候调用这些规则：
<pre>if ($string ~~ $digits) {...}
if ($string ~~ /<$digits>/) {...} # 这种也应当是可用的，但目前 pugs 还没实现</pre>
如果是带名规则 rule digits, 我们可以怎么用：
<pre><code>$string ~~ /&lt;digits>/;</code></pre>

<h3>Grammar</h3>
一个语法规则/grammar 是许多个规则/rule 的集合。事实上一个 grammar 就是一个类，只不过继承了基类 Rule. 而 rule 我们就可以把它看作类 grammar 的方法。<br />
这也意味着 grammar 可以继承其他 grammar，且它们给了 rule 一个命名空间。
<pre>grammar Hitchhikers {
    rule name {Zaphod|Ford|Arthur} 
    rule id   {\d+} 
    . . .  
}</pre>
如果在该语法规则属于当前包，我们可以像前面一样直接调用 <id> 等，而如果该语法规则不属于当前包（外面的），那我们调用的时候就得加命名空间：
<pre><code>if $my_id ~~ /&lt;id>/ { ... } # grammar Hitchhikers 在当前包
f $my_id ~~ /&lt;Hitchhikers.id>/ { ... } # 不属于当前包</code></pre>
语法对于解析复杂的数据结构非常有用。

<h3>see u later</h3>
learning never stops.</div>
<p><&lt;Previous: <a href="Perl6_ES17.html">my enum Example17 <<:Perl(6) Today>></a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES19.html">m:nth(19)/Perl6Examples/</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=my%20$queen;%20rule%20me%20%7BPerl6%7CExamples18%7D&url=http://www.fayland.org/journal/Perl6_ES18.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='Perl6_Rules.html'>用 Perl6::Rules 来写 Formatter</a> < <span class='digit'>2005-09-27 10:02:45</span> ></li><li><a href='Perl6_ES14.html'>has $.Examples14 handles 'Perl6';</a> < <span class='digit'>2005-06-02 01:38:59</span> ></li><li><a href='050519.html'>Synopsis localization</a> < <span class='digit'>2005-05-19 11:21:25</span> ></li><li><a href='Perl6_ES0.html'>@Examples[0] is Perl6</a> < <span class='digit'>2005-05-19 20:26:08</span> ></li><li><a href='Perl6_ES1.html'>given @Examples[1] when Perl6</a> < <span class='digit'>2005-05-19 22:05:56</span> ></li><li><a href='Perl6_ES2.html'>@Perl6 <== @Examples xx 2</a> < <span class='digit'>2005-05-20 18:53:54</span> ></li><li><a href='Perl6_ES3.html'>my Perl6 @Examples[3]</a> < <span class='digit'>2005-05-21 13:53:16</span> ></li><li><a href='Perl6_ES4.html'>say q:2 '@*Examples.[4] &Perl6()';</a> < <span class='digit'>2005-05-22 12:24:12</span> ></li><li><a href='Perl6_ES5.html'>sub Perl6 (*@Examples[5] is copy)</a> < <span class='digit'>2005-05-22 15:37:26</span> ></li><li><a href='Perl6_ES6.html'>multi sub Examples (6, Perl6) {...}</a> < <span class='digit'>2005-05-23 22:43:33</span> ></li><li><a href='Perl6_ES7.html'>sub infix:<(7)> ($Perl6, @Examples)</a> < <span class='digit'>2005-05-24 02:16:42</span> ></li><li><a href='Perl6_ES8.html'>let @Examples[8] = 'Perl6';</a> < <span class='digit'>2005-05-24 13:05:58</span> ></li><li><a href='Perl6_ES9.html'>Perl6 | Examples & 9 ^ junction</a> < <span class='digit'>2005-05-26 12:35:29</span> ></li><li><a href='Perl6_ES10.html'>%Examples{'IO'} = open('Perl6');</a> < <span class='digit'>2005-05-30 00:24:01</span> ></li><li><a href='Perl6_ES11.html'>class Examples11 is Perl6 { ... }</a> < <span class='digit'>2005-05-30 13:31:31</span> ></li><li><a href='Perl6_ES12.html'>$Perl6 = $class.bless(:Example<12>);</a> < <span class='digit'>2005-05-31 11:38:46</span> ></li><li><a href='Perl6_ES13.html'>role Example13 { # Perl6 }</a> < <span class='digit'>2005-05-31 18:22:03</span> ></li><li><a href='Perl6_ES16.html'>my subtype Examples16 of Perl6 where /^kissu$/</a> < <span class='digit'>2005-06-04 23:59:29</span> ></li><li><a href='Perl6_ES17.html'>my enum Example17 <<:Perl(6) Today>></a> < <span class='digit'>2005-06-05 12:14:08</span> ></li><li><a href='Perl6_ES19.html'>m:nth(19)/Perl6Examples/</a> < <span class='digit'>2005-06-06 22:02:01</span> ></li></ul>
Created on <span class="digit">2005-06-06 12:26:32</span>, Last modified on <span class="digit">2005-06-06 21:57:14</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>